<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        /*
            总结：
            1. 类中的实例不是必须写的，要对实例进行一些初始化操作，如添加指定属性才写
            2. 如果A类继承了B类，且A类中写了构造器，那么A类构造器中的super是必须调用的
            3. 类中所定义的方法，都是放在了类的原型上，供类的实例使用
        */
        class Person{
            //构造器方法(定义属性)
            constructor(name, age){
                //构造器中的this指向类的实例对象
                this.name = name
                this.age = age
            }
            //一般方法(行为)
            speak(){
                //方法放在了类的原型对象上了,供实例使用，通过Person实例调用方法时，this指向实例对象
                console.log(`我叫${this.name},我${this.age}岁`)
            }
        }

        // const p1 = new Person('tom', 18)
        // p1.speak()
        // console.log(p1)

        //创建一个Student，继承自Person
        class Student extends Person{
            constructor(name, age, grade){
                //super 必须放在最前面
                super(name, age)
                this.grade = grade
                this.school = "清华"    //所有创建的实例都是清华大学的学生
            }

            //重写父类方法
            speak(){
                console.log(`我叫${this.name}，我${this.age}岁，我读${this.grade}年纪`)
            }
        }
        
        const s1 = new Student('bob', 15, '高一')
        console.log(s1)
        s1.speak()

        class Car{
            constructor(name, price){
                this.name = name
                this.price = price
                this.wheel = 4
            }
            // 类里面可以直接写赋值语句，如下代码给Car的实例对象添加一个属性，名为a，值为1
            a = 1
            // 给类自身添加属性
            static b = 100
        }
        const c1 = new Car("奔驰", 199)
        const c2 = new Car("宝马", 200)
        console.log(c1)
    </script>
</body>
</html>